package com.gxa.scdx.cloud.user.service.impl;


import com.gxa.scdx.cloud.user.pojo.User;
import com.gxa.scdx.cloud.user.mapper.UserMapper;
import com.gxa.scdx.cloud.user.service.UserService;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;

/**
 * 用户表(User)表服务实现类
 *
 * @author  颜可翔
 */
@Service("userService")
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;
    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    public  Map<String, Object> count (){
        Map<String, Object> map = new HashMap<>();

        int count  = this.userMapper.count();

        map.put("code", 200);
        map.put("msg", "success");
        map.put("data",count);

        return map;
    }

    public Map<String, Object> registerUser(String username, String password, String phone) {
        Map<String, Object> map = new HashMap<>();

        if (userMapper.getUser(username)!= null){
            map.put("code", 500);
            map.put("msg", "failed");
        }
        try {
            User newUser = new User(username, password);
            newUser.setPhone(phone);
            newUser.setCreateTime(new Date());
            newUser.setLastLoginTime(new Date());
            newUser.setDepartmentId(1);
            newUser.setRoleId(2);
            userMapper.insert(newUser);

            String roleId = "2";
            String json = password+"," + roleId;

            redisTemplate.opsForValue().set(username, json);
            map.put("code", 200);
            map.put("msg", "success");
        } catch (Exception e) {
            map.put("code", 500);
            map.put("msg", e.getMessage());
        }
        return map;
    }

    public User getUserByName(String username) {
        return userMapper.getUser(username);
    }

    /**
     * 根据模糊条件查询总个数
     *
     * @return 返回查询到的总个数
     */
    public Map<String, Object> selectForCount(String search_username, String search_phone, String search_date) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data", this.userMapper.selectForCount(search_username, search_phone, search_date));
        return map;
    }

    /**
     * 查询分页数据
     */
    public Map<String, Object> selectForPage(int index, String search_username, String search_phone, String search_date) {
        // 获取当前表中的总记录
        int tableCount = this.userMapper.selectForCount(search_username, search_phone, search_date);
        // 总页码计算   (总条数 - 1) / 每页显示条数  + 1
        // (100 - 1) / 10 + 1 = 10        (101 - 1) / 10 + 1 = 11      (99 - 1) / 10 + 1 = 10
        int pageCount = (tableCount - 1) / 10 + 1;
        // 计算每页开始的下标值
        index = (index - 1) * 10;
        Map<String, Object> map = new HashMap<>();
        map.put("code", 0);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "查询成功");
        map.put("pageCount", pageCount);  // 查询的记录总页码
        map.put("count", tableCount);     // 当前表中的总条数
        map.put("data", this.userMapper.selectForPage(index, search_username, search_phone, search_date));
        return map;
    }

    /**
     * 查询所有数据
     *
     * @return 返回所有数据
     */
    public Map<String, Object> selectAll() {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data", this.userMapper.selectAll());
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    public Map<String, Object> selectById(Integer id) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("obj", this.userMapper.selectById(id));
        return map;
    }

    /**
     * 新增数据
     *
     * @param user 实例对象
     * @return 实例对象
     */
    public Map<String, Object> insert(User user) {
        this.userMapper.insert(user);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "success");
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param user 实例对象
     * @return 实例对象
     */
    public Map<String, Object> updateByName(User user) {
        this.userMapper.updateByName(user);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "更新成功");
        map.put("data","success");
        return map;
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    public Map<String, Object> deleteById(String id) {

        this.userMapper.deleteById(id);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "删除成功");
        map.put("data","success");
        return map;
    }
}